package com.shangma.cn.controller;

import com.github.pagehelper.PageHelper;
import com.shangma.cn.common.http.AxiosResult;
import com.shangma.cn.common.http.AxiosStatus;
import com.shangma.cn.common.page.PageBean;
import com.shangma.cn.common.perm.HasPerm;
import com.shangma.cn.common.valid.group.AddGroup;
import com.shangma.cn.common.valid.group.UpdateGroup;
import com.shangma.cn.controller.base.BaseController;
import com.shangma.cn.dto.BrandDTO;
import com.shangma.cn.entity.Brand;
import com.shangma.cn.query.BrandQuery;
import com.shangma.cn.service.BrandService;
import com.shangma.cn.transfer.BrandTransfer;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.bind.BindResult;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 开发者：辉哥
 * 特点： 辉哥很帅
 * 开发时间：2021/6/22 11:00
 * <p>
 * ssm的时候 跨域
 *
 * @CrossOrigin 第二种方式：
 * 《mvc:cors》
 * <p>
 * <p>
 * 第三种方式：
 * 在springmvc的配置类中 重写方法
 * <p>
 * <p>
 * 第四种：
 * Filter
 * <p>
 * 第五种：
 * 向容器中添加CorsFilter（添加在父容器中）
 * <p>
 * web.xml或者替代web.xml的哪个类中  使用DelegatingFilterProxy 添加到web的Filter中
 * <p>
 * axios.get("http://localhost:10086/findById?id=?")
 * 文件说明：
 */
@RestController
@RequestMapping("brand")
@Api(tags = "品牌管理", description = "品牌管理")
public class BrandController extends BaseController {


    /**
     * 为了避免不手写接口完档  此时可以使用postman
     * <p>
     * 此时可以使用postman
     * 为什么使用postman
     * 1: 后台程序开发controller  由于此时没有前端页面衬托  此时需要测试controller
     * 此时需要使用postman来测试
     * <p>
     * 2： 测试完了之后 controller没有错误 此时把测试接口保存起来
     * <p>
     * 3: 项目写完了  在postman中 也测试完了 此时也说 保存完了
     * <p>
     * 4：  把保存后的导出  给前端就可以了
     * <p>
     * <p>
     * <p>
     * swagger2 通过配置+注解的方式 自动生成接口文档
     */

    @Autowired
    private BrandService brandService;


    @Autowired
    private BrandTransfer brandTransfer;


    @ApiOperation(value = "分页条件查询")
    @GetMapping("searchPage")
    public AxiosResult<PageBean<BrandDTO>> searchPage(BrandQuery brandQuery) {
        //开启分页
        PageHelper.startPage(brandQuery.getCurrentPage(), brandQuery.getPageSize());
        PageBean<BrandDTO> pageBean = brandService.searchPage(brandQuery);
        return AxiosResult.success(pageBean);
    }

//    @ApiOperation(value = "查询所有")
//    @GetMapping
//    public AxiosResult<List<BrandDTO>> list() {
//        return AxiosResult.success(brandService.list());
//    }

    @GetMapping("{id}")
    @ApiOperation(value = "id查询")
    public AxiosResult<BrandDTO> findById(@PathVariable Long id) {
        return AxiosResult.success(brandTransfer.toDTO(brandService.findById(id)));
    }

    @PostMapping
    @ApiOperation(value = "添加品牌")
    @HasPerm(permSign = "good:brand:add")
    public AxiosResult add(@Validated(AddGroup.class) @RequestBody Brand brand) {
        return toAxios(brandService.add(brand));
    }

    @PutMapping
    @ApiOperation(value = "修改品牌")
    @HasPerm(permSign = "good:brand:edit")
    public AxiosResult<Void> update(@RequestBody @Validated(UpdateGroup.class) Brand brand) {
        //判断表单校验有没有成功
        return toAxios(brandService.update(brand));
    }

    @DeleteMapping("{id}")
    @ApiOperation(value = "通过id删除")
    @HasPerm(permSign = "good:brand:delete")
    public AxiosResult<Void> deleteById(@PathVariable Long id) {
        return toAxios(brandService.deleteById(id));
    }

    @DeleteMapping("batch/{ids}")
    @ApiOperation(value = "通过id批量删除")
    @HasPerm(permSign = "good:brand:batch")
    public AxiosResult<Void> batchDeleteByIds(@PathVariable List<Long> ids) {
        return toAxios(brandService.batchDeleteByIds(ids));
    }

}
